﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Caixa.Model;
using Caixa.DB;
using System.Data.Common;
using System.Collections;
using System.Data;

namespace Caixa.DAO
{
	public static class TransacaoDAO
	{
		#region " Methods "

		#region " Get Methods "

		public static Transacao GetByID(int id)
		{
			Transacao t = null;

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}, {2}, {3}, {4}, {5}, {6}
					FROM {0}
					WHERE
						{1} = :{1}
				",
					Transacao.Fields.TABELA,
					Transacao.Fields.ID,
					Transacao.Fields.IDDESTINATARIOTRANSACAO,
					Transacao.Fields.TRANSACAOTIPO,
					Transacao.Fields.DATA,
					Transacao.Fields.DATAAGENDAMENTO,
					Transacao.Fields.VALOR
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Transacao.Fields.ID, id));

				// Executa a query no Banco de dados
				IEnumerator data = db.SelectSqlDr(SQL, parms.ToArray()).GetEnumerator();

				// Converte o resultado do Banco de dados em objeto
				t = DAHelper.ToModel<Transacao>(data);
			}

			return t;
		}

		public static List<Movimentacao> GetMovimentacao(int transacaoID)
		{
			List<Movimentacao> movimentacaoList = new List<Movimentacao>();

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{0}
					FROM TransacaoMovimentacao
					WHERE
						{1} = :{1}
				",
					Movimentacao.Fields.ID,
					Transacao.Fields.ID
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Transacao.Fields.ID, transacaoID));

				// Executa a query no Banco de dados				
				DataTable dt = db.SelectSqlDt(SQL, parms.ToArray());

				// Restaga a instâcia do objeto
				foreach (DataRow row in dt.Rows)
				{
					int movID;
					int.TryParse(string.Format("{0}", row[Movimentacao.Fields.ID]), out movID);
					Movimentacao m = MovimentacaoDAO.GetByID(movID);
					if (m != null)
						movimentacaoList.Add(m);
				}
			}

			return movimentacaoList;
		}

		#endregion

		#region " Management Methods "

		public static bool RelacionaMovimentacao(int transacaoID, int movimentacaoID)
		{
			bool success = false;

			using (DAHelper db = new DAHelper())
			{
				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Transacao.Fields.ID, transacaoID));
				parms.Add(db.GetParameter(Movimentacao.Fields.ID, movimentacaoID));

				// Executa a query no Banco de dados
				db.InsertSql("TransacaoMovimentacao", parms.ToArray());
				success = true;
			}

			return success;
		}

		#endregion

		#region " DDL Methods "

		public static int Insert(Transacao t)
		{
			int newID = 0;

			using (DAHelper db = new DAHelper())
			{
				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Transacao.Fields.IDDESTINATARIOTRANSACAO, t.IDDestinatarioTransacao));
				parms.Add(db.GetParameter(Transacao.Fields.TRANSACAOTIPO, t.TransacaoTipo));
				parms.Add(db.GetParameter(Transacao.Fields.DATA, t.Data, DbType.Date));
				parms.Add(db.GetParameter(Transacao.Fields.DATAAGENDAMENTO, t.Data, DbType.Date));
				parms.Add(db.GetParameter(Transacao.Fields.VALOR, t.Valor, DbType.Double));

				// Executa a query no Banco de dados e retorna o ID do novo registro
				newID = db.InsertSql(Transacao.Fields.TABELA, parms.ToArray());
			}

			return newID;
		}

		public static bool Update(Transacao t)
		{
			bool success = false;

			using (DAHelper db = new DAHelper())
			{
				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Transacao.Fields.IDDESTINATARIOTRANSACAO, t.IDDestinatarioTransacao));
				parms.Add(db.GetParameter(Transacao.Fields.TRANSACAOTIPO, t.TransacaoTipo));
				parms.Add(db.GetParameter(Transacao.Fields.DATA, t.Data, DbType.Date));
				parms.Add(db.GetParameter(Transacao.Fields.DATAAGENDAMENTO, t.DataAgendamento, DbType.Date));
				parms.Add(db.GetParameter(Transacao.Fields.VALOR, t.Valor, DbType.Double));

				// Define a cláusula where do Update
				string sWhere = string.Format("{0} = {1}", Transacao.Fields.ID, t.ID);

				// Executa a query no Banco de dados e retorna se foi atualizado com sucesso
				success = db.UpdateSql(Transacao.Fields.TABELA, parms.ToArray(), sWhere);
			}

			return success;
		}

		public static bool Delete(Transacao t)
		{
			bool success = false;

			using (DAHelper db = new DAHelper())
			{
				// Define a cláusula where do Delete
				string sWhere = string.Format("{0} = {1}", Transacao.Fields.ID, t.ID);

				// Executa a query no Banco de dados e retorna se o registro foi excluido com sucesso
				success = db.DeleteSql(Transacao.Fields.TABELA, sWhere);
			}

			return success;
		}

		#endregion

		#endregion
	}
}
